package inge_soft.gestoriusNuevo.business.service.implementation;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import inge_soft.gestoriusNuevo.business.service.abstraction.IServicioEvento;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IActividadDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.ICategoriaDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IEstadoDAO;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.IEventoDAO;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Actividad;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Categoria;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Estado;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Evento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Institucion;

/* FALTA TESTEAR */
@Service("eventoService")
public class EventoService implements IServicioEvento {

	@Autowired
	@Qualifier("actividadDAO")
	IActividadDAO actividadDAO;

	@Autowired
	@Qualifier("eventoDAO")
	IEventoDAO eventoDAO;

	@Autowired
	@Qualifier("categoriaDAO")
	ICategoriaDAO categoriaDAO;

	@Autowired
	@Qualifier("estadoDAO")
	IEstadoDAO estadoDAO;

	public List<Evento> obtenerTodosEventos(Institucion institucion)
			throws DataAccessException {
		return eventoDAO.obtenerTodosEventos(institucion);
	}

	@Transactional
	public void crearEvento(Institucion institucion, Evento evento)
			throws DataAccessException {
		evento.setEstado(estadoDAO.obtenerEstado("Activo"));
		eventoDAO.crearEvento(institucion, evento);
	}

	@Transactional
	public void modificarEvento(Evento evento) throws DataAccessException {
		evento.setEstado(estadoDAO
				.obtenerEstado(evento.getEstado().getNombre()));// Se agrega, de
																// lo contrario
																// no toma el
																// estado del
																// evento
		eventoDAO.modificarEvento(evento);
	}

	@Transactional
	public void cancelarEvento(Evento evento) throws DataAccessException {
		Estado estado = estadoDAO.obtenerEstado("Cancelada");
		if (evento.getListaActividades() != null) {
			for (Actividad actividad : evento.getListaActividades()) {
				actividad.setEstado(estado);
				actividadDAO.modificarActividad(actividad);
			}
		} 
		evento.setEstado(estado);
		eventoDAO.modificarEvento(evento);

	}

	public List<Categoria> obtenerTodasCategoriasEventos()
			throws DataAccessException {
		return categoriaDAO.obtenerTodasCategoriasEventos();
	}

	public List<Estado> obtenerTodosEstados() throws DataAccessException {
		return estadoDAO.obtenerTodosEstados();
	}

	public Date primerFechaEventos() {
		// TODO Auto-generated method stub
		return eventoDAO.primerFecha();
	}

}
